Claude API란 무엇인가?
1.1 개요
Claude API는 Anthropic이 제공하는 RESTful API로, https://api.anthropic.com 엔드포인트를 통해 Claude 대규모 언어 모델(LLM)에 프로그래밍 방식으로 접근할 수 있게 해 줍니다. 채팅 인터페이스(claude.ai)에서 사람이 직접 대화하는 것과 달리, API를 사용하면 여러분의 웹 서비스, 모바일 앱, 자동화 파이프라인 등에서 Claude의 능력을 직접 활용할 수 있습니다.
1.2 무엇을 할 수 있는가?
Claude API로 구현할 수 있는 대표적인 활용 사례는 다음과 같습니다.
- 텍스트 생성·요약·번역 : 문서 요약, 다국어 번역, 콘텐츠 생성
- 코드 생성·리뷰·디버깅 : 코드를 작성하고, 버그를 찾고, 리팩토링을 제안
- 이미지 분석 (Vision) : 이미지를 입력받아 내용을 설명하거나 분석
- Tool Use (함수 호출) : 외부 API나 데이터베이스와 연동하여 실시간 정보 활용
- 대화형 에이전트 : 고객 지원 챗봇, 업무 자동화 에이전트 구축
- 데이터 분석·추출 : 비정형 데이터에서 구조화된 정보를 추출
1.3 제공되는 API 종류
| API | 상태 | 설명 |
|---|---|---|
| Messages API | GA | Claude와 대화 (핵심 API) |
| Message Batches API | GA | 대량 요청 비동기 처리 (50% 할인) |
| Token Counting API | GA | 토큰 수 사전 확인 |
| Models API | GA | 사용 가능한 모델 목록 조회 |
| Files API | Beta | 파일 업로드 및 관리 |
| Agents / Sessions API | Beta | 클라우드 매니지드 에이전트 세션 |
1.4 접근 경로
Claude 모델은 Anthropic 직접 API 외에도 AWS Bedrock, Google Vertex AI, Microsoft Azure AI(Foundry)를 통해서도 사용할 수 있습니다. 직접 API를 사용하면 가장 최신 기능을 가장 먼저 이용할 수 있고, 클라우드 플랫폼을 사용하면 기존 인프라에 통합하기 편리합니다.
모델 종류와 선택 가이드
2.1 Claude 모델 패밀리
Anthropic은 용도와 성능에 따라 세 가지 모델 라인을 제공합니다. Opus는 가장 강력한 추론 능력을, Sonnet은 속도와 성능의 균형을, Haiku는 가장 빠른 응답 속도를 제공합니다.
| 모델 | API ID | 컨텍스트 | 최대 출력 | 특징 |
|---|---|---|---|---|
| Claude Opus 4.7 | claude-opus-4-7 | 1M 토큰 | 128K 토큰 | 최고 성능, 에이전틱 코딩 탁월 |
| Claude Opus 4.6 | claude-opus-4-6 | 1M 토큰 | 128K 토큰 | 복잡한 추론, Fast Mode 지원 |
| Claude Sonnet 4.6 | claude-sonnet-4-6 | 1M 토큰 | 64K 토큰 | 속도+지능 균형, Extended Thinking |
| Claude Haiku 4.5 | claude-haiku-4-5-20251001 | 200K 토큰 | 64K 토큰 | 가장 빠름, 비용 효율적 |
2.2 모델 선택 기준
어떤 모델을 선택해야 할지 모르겠다면, 다음 기준을 참고하세요.
- 최고 품질이 필요한 복잡한 작업 → Claude Opus 4.7 (수학 증명, 복잡한 코드 설계, 고난도 분석)
- 일반적인 개발·비즈니스 작업 → Claude Sonnet 4.6 (코드 생성, 문서 작성, 데이터 분석)
- 빠른 응답이 필요한 대량 처리 → Claude Haiku 4.5 (챗봇, 분류, 간단한 요약)
2.3 Knowledge Cutoff
각 모델은 학습 데이터의 마감 시점(Knowledge Cutoff)이 다릅니다. Opus 4.7은 2026년 1월까지의 정보를, Sonnet 4.6도 2026년 1월 학습 데이터를 활용합니다. 이 시점 이후의 최신 정보가 필요하다면 Web Search 도구를 함께 사용해야 합니다.
시작하기 (Setup)
3.1 API 키 발급
Claude API를 사용하려면 먼저 Anthropic Console에서 계정을 만들고 API 키를 발급받아야 합니다.
- console.anthropic.com에서 회원가입
- Settings → API Keys 에서 새 키 생성
- 키를 안전한 곳에 저장 (한 번만 표시됨)
- 최소 $5 크레딧 구매 (Tier 1 진입 조건)
3.2 SDK 설치
Anthropic은 Python, TypeScript, Java, Go, C#, Ruby, PHP 등 다양한 공식 SDK를 제공합니다. SDK를 사용하면 인증, 재시도, 에러 처리, 스트리밍 등을 자동으로 관리해 줍니다.
# Python SDK 설치
pip install anthropic
# TypeScript/Node.js SDK 설치
npm install @anthropic-ai/sdk
3.3 환경 변수 설정
API 키를 코드에 직접 넣지 말고, 환경 변수로 관리하는 것이 보안상 안전합니다.
# Linux / macOS
export ANTHROPIC_API_KEY="sk-ant-api03-xxxxx..."
# Windows (PowerShell)
$env:ANTHROPIC_API_KEY = "sk-ant-api03-xxxxx..."
3.4 첫 번째 API 호출
import anthropic
client = anthropic.Anthropic() # 환경변수에서 API 키 자동 로드
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[
{"role": "user", "content": "안녕하세요! Claude API를 처음 사용해 봅니다."}
]
)
print(message.content[0].text)
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic(); // 환경변수에서 API 키 자동 로드
const message = await client.messages.create({
model: "claude-sonnet-4-6",
max_tokens: 1024,
messages: [
{ role: "user", content: "안녕하세요! Claude API를 처음 사용해 봅니다." }
],
});
console.log(message.content[0].text);
3.5 cURL로 직접 호출
SDK 없이 HTTP 요청을 직접 보낼 수도 있습니다. 디버깅이나 테스트에 유용합니다.
curl https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Hello, Claude!"}
]
}'
3.6 필수 인증 헤더
| 헤더 | 값 | 필수 |
|---|---|---|
x-api-key | API 키 (sk-ant-...) | Yes |
anthropic-version | 2023-06-01 | Yes |
content-type | application/json | Yes |
Messages API 기본
4.1 Messages API란?
Messages API는 Claude와 대화하기 위한 핵심 엔드포인트입니다. POST /v1/messages로 요청을 보내면, Claude가 메시지에 대한 응답을 생성하여 돌려줍니다. API는 상태가 없기(stateless) 때문에, 매 요청마다 전체 대화 이력을 함께 보내야 합니다.
4.2 요청 구조
{
"model": "claude-sonnet-4-6",
"max_tokens": 4096,
"system": "당신은 친절한 한국어 도우미입니다.",
"messages": [
{"role": "user", "content": "파이썬으로 피보나치 수열을 구하는 함수를 짜줘."}
],
"temperature": 0.7,
"top_p": 0.9
}
4.3 주요 파라미터 설명
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
model | string | Yes | 사용할 모델 ID |
max_tokens | integer | Yes | 최대 출력 토큰 수 |
messages | array | Yes | 대화 메시지 배열 (user/assistant 교대) |
system | string | No | 시스템 프롬프트 (Claude의 역할/행동 지침) |
temperature | float | No | 랜덤성 (0.0=결정적, 1.0=창의적) |
top_p | float | No | Nucleus sampling (0~1) |
stop_sequences | array | No | 응답을 멈출 문자열 목록 |
stream | boolean | No | 스트리밍 응답 여부 |
4.4 응답 구조
{
"id": "msg_01XFDUDYJgAACzvnptvVoYEL",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": "다음은 파이썬으로 작성한 피보나치 수열 함수입니다..."
}
],
"model": "claude-sonnet-4-6",
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 42,
"output_tokens": 256
}
}
4.5 멀티턴 대화
API는 stateless이므로, 이전 대화를 이어가려면 전체 대화 이력을 messages 배열에 담아야 합니다. user와 assistant 메시지를 번갈아 배치합니다.
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=2048,
system="당신은 파이썬 전문가입니다.",
messages=[
# 1턴: 사용자 질문
{"role": "user", "content": "파이썬에서 리스트와 튜플의 차이는?"},
# 1턴: Claude 응답 (이전 응답을 그대로 넣음)
{"role": "assistant", "content": "리스트는 수정 가능(mutable)하고..."},
# 2턴: 후속 질문
{"role": "user", "content": "그렇다면 언제 튜플을 써야 하나요?"}
]
)
4.6 시스템 프롬프트 활용
시스템 프롬프트는 Claude의 행동, 성격, 규칙을 정의하는 특별한 지시문입니다. messages 배열과 별도로 system 파라미터에 지정합니다. 좋은 시스템 프롬프트는 일관된 응답 품질을 보장합니다.
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=4096,
system="""당신은 시니어 백엔드 개발자입니다.
규칙:
- 한국어로 답변합니다.
- 코드에는 항상 주석을 포함합니다.
- 보안 취약점이 있으면 반드시 경고합니다.
- 응답은 간결하고 실용적으로 합니다.""",
messages=[
{"role": "user", "content": "Node.js에서 JWT 인증을 구현하는 방법을 알려줘."}
]
)
•
end_turn — Claude가 자연스럽게 응답을 완료•
max_tokens — max_tokens 한도에 도달하여 잘림•
stop_sequence — 지정한 stop_sequences 문자열과 매치•
tool_use — 도구 호출이 필요하여 중단 (Ch.7 참고)
스트리밍 (Streaming)
5.1 왜 스트리밍이 필요한가?
일반적인 API 호출은 Claude의 전체 응답이 완성될 때까지 기다린 후 한꺼번에 받습니다. 긴 응답의 경우 수 초~수십 초를 기다려야 합니다. 스트리밍을 사용하면 응답이 생성되는 즉시 토큰 단위로 전달받을 수 있어, 사용자에게 실시간으로 텍스트가 나타나는 경험(ChatGPT처럼)을 제공할 수 있습니다.
5.2 Server-Sent Events (SSE)
Claude의 스트리밍은 SSE(Server-Sent Events) 프로토콜을 사용합니다. 요청 시 "stream": true를 설정하면, 서버가 응답을 작은 이벤트 단위로 보내줍니다.
5.3 Python SDK 스트리밍
import anthropic
client = anthropic.Anthropic()
# 방법 1: with 문 사용 (권장)
with client.messages.stream(
model="claude-sonnet-4-6",
max_tokens=2048,
messages=[
{"role": "user", "content": "양자 컴퓨팅의 원리를 설명해줘."}
]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
print() # 줄바꿈
# 방법 2: 이벤트 기반 처리
with client.messages.stream(
model="claude-sonnet-4-6",
max_tokens=2048,
messages=[
{"role": "user", "content": "양자 컴퓨팅의 원리를 설명해줘."}
]
) as stream:
for event in stream:
if event.type == "content_block_delta":
if event.delta.type == "text_delta":
print(event.delta.text, end="", flush=True)
5.4 SSE 이벤트 타입
| 이벤트 타입 | 설명 |
|---|---|
message_start | 메시지 시작, 메타 정보 포함 |
content_block_start | 콘텐츠 블록 시작 (text, thinking, tool_use) |
content_block_delta | 콘텐츠 증분 (실제 텍스트 토큰) |
content_block_stop | 콘텐츠 블록 종료 |
message_delta | 메시지 메타 업데이트 (stop_reason 등) |
message_stop | 전체 메시지 완료 |
5.5 TypeScript 스트리밍
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
const stream = client.messages.stream({
model: "claude-sonnet-4-6",
max_tokens: 2048,
messages: [
{ role: "user", content: "양자 컴퓨팅의 원리를 설명해줘." }
],
});
// 텍스트만 간단히 출력
stream.on("text", (text) => {
process.stdout.write(text);
});
// 완료 후 최종 메시지 확인
const finalMessage = await stream.finalMessage();
console.log("\n\nTotal tokens:", finalMessage.usage);
멀티모달 (Vision)
6.1 이미지 입력 기능
Claude는 텍스트뿐 아니라 이미지도 입력으로 받을 수 있습니다. 사진 속 텍스트를 읽거나, 차트를 분석하거나, UI 스크린샷을 설명하는 등 다양한 시각 관련 작업을 수행할 수 있습니다. 지원하는 이미지 형식은 JPEG, PNG, GIF, WebP입니다.
6.2 이미지 전달 방법
이미지를 Claude에 전달하는 방법은 세 가지입니다.
- Base64 인코딩 : 이미지를 Base64 문자열로 변환하여 직접 포함
- URL 참조 : 공개 접근 가능한 이미지 URL을 지정
- Files API : 사전에 업로드한 파일 ID를 참조
6.3 Base64 방식 예제
import anthropic
import base64
client = anthropic.Anthropic()
# 이미지 파일을 Base64로 변환
with open("chart.png", "rb") as f:
image_data = base64.standard_b64encode(f.read()).decode("utf-8")
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=2048,
messages=[
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": image_data
}
},
{
"type": "text",
"text": "이 차트의 핵심 트렌드를 분석해 주세요."
}
]
}
]
)
print(response.content[0].text)
6.4 URL 방식 예제
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=2048,
messages=[
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "url",
"url": "https://example.com/dashboard-screenshot.png"
}
},
{
"type": "text",
"text": "이 대시보드에서 매출이 가장 높은 달은?"
}
]
}
]
)
6.5 여러 이미지 동시 입력
하나의 메시지에 여러 이미지를 포함할 수 있습니다. 이미지 간 비교 분석, 여러 페이지의 문서 처리 등에 활용됩니다.
• 이미지 크기가 클수록 토큰 소비가 증가합니다 (평균 웹 이미지 ~1,000-2,000 토큰)
• 고해상도가 반드시 더 좋은 결과를 주는 것은 아닙니다. 필요한 정보가 보이면 충분합니다
• 텍스트가 많은 이미지(문서, 표)는 Claude가 잘 읽습니다
• PDF도 지원됩니다 (최대 100페이지)
Tool Use (함수 호출)
7.1 Tool Use란?
Tool Use는 Claude가 여러분이 정의한 외부 함수(도구)를 호출할 수 있게 하는 기능입니다. Claude는 사용자의 요청을 분석한 뒤, 적절한 도구를 선택하고 필요한 인자를 구조화하여 반환합니다. 실제 함수 실행은 여러분의 코드에서 담당하며, 결과를 다시 Claude에게 전달하면 최종 응답을 생성합니다.
이 메커니즘을 통해 Claude는 실시간 날씨 조회, 데이터베이스 검색, 이메일 발송, 계산기 사용 등 LLM 단독으로는 불가능한 작업을 수행할 수 있습니다.
7.2 동작 흐름
- 여러분이 도구 정의(이름, 설명, 파라미터 스키마)와 사용자 메시지를 함께 전송
- Claude가 적절한 도구를 선택하고, 인자를 채워서
tool_use블록을 반환 - 여러분의 코드가 해당 함수를 실행하고 결과를 얻음
- 결과를
tool_result로 Claude에게 전달 - Claude가 결과를 바탕으로 최종 답변을 생성
7.3 도구 정의 예제
import anthropic
client = anthropic.Anthropic()
# 도구(함수) 정의
tools = [
{
"name": "get_weather",
"description": "지정된 도시의 현재 날씨 정보를 반환합니다.",
"input_schema": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "날씨를 조회할 도시 이름 (예: 서울, Tokyo)"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "온도 단위"
}
},
"required": ["city"]
}
}
]
# 1단계: Claude에게 요청
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
tools=tools,
messages=[
{"role": "user", "content": "서울 날씨 어때?"}
]
)
# 2단계: Claude가 도구 호출을 요청하면 처리
if response.stop_reason == "tool_use":
tool_block = next(b for b in response.content if b.type == "tool_use")
print(f"호출할 도구: {tool_block.name}")
print(f"인자: {tool_block.input}")
# → 호출할 도구: get_weather
# → 인자: {"city": "서울", "unit": "celsius"}
# 3단계: 실제 함수 실행 (여기서는 가상 결과)
weather_result = {"temperature": 22, "condition": "맑음", "humidity": 45}
# 4단계: 결과를 Claude에게 전달
final_response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
tools=tools,
messages=[
{"role": "user", "content": "서울 날씨 어때?"},
{"role": "assistant", "content": response.content},
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": tool_block.id,
"content": str(weather_result)
}
]
}
]
)
print(final_response.content[0].text)
# → "서울의 현재 날씨는 맑고, 기온은 22°C이며 습도는 45%입니다."
7.4 도구의 종류
| 구분 | 실행 위치 | 예시 |
|---|---|---|
| Client Tools (사용자 정의) | 여러분의 서버 | DB 조회, 외부 API 호출, 파일 처리 |
| Server Tools (Anthropic 제공) | Anthropic 인프라 | web_search, web_fetch, code_execution |
7.5 서버 도구 (Web Search) 사용
# 웹 검색 도구 사용 (Anthropic이 실행을 처리)
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=2048,
tools=[{"type": "web_search_20260209"}],
messages=[
{"role": "user", "content": "오늘 한국 주식시장 상황을 알려줘."}
]
)
# 서버 도구는 별도 실행 없이 바로 결과 포함
print(response.content[-1].text)
description을 상세하게 작성할수록 Claude가 적절한 도구를 정확하게 선택합니다. "필수 파라미터", "언제 이 도구를 사용해야 하는지", "반환값 형태" 등을 설명에 포함하세요.
Extended Thinking (확장 사고)
8.1 개념
Extended Thinking은 Claude가 최종 답변을 내놓기 전에 내부적으로 깊이 사고하는 과정을 활성화하는 기능입니다. 복잡한 수학 문제, 다단계 추론, 코드 아키텍처 설계 등에서 응답 품질을 크게 향상시킵니다.
이 기능을 켜면 응답에 thinking 블록이 추가되어, Claude가 어떤 과정으로 결론에 도달했는지 확인할 수 있습니다(요약 형태로 제공).
8.2 모델별 사용법 차이
| 모델 | 권장 방식 | 설정 |
|---|---|---|
| Opus 4.7 | Adaptive Thinking | thinking: {type: "adaptive"} + effort 파라미터 |
| Opus 4.6 | Adaptive Thinking (권장) | thinking: {type: "adaptive"} |
| Sonnet 4.6 | Adaptive Thinking (권장) | thinking: {type: "adaptive"} |
| Haiku 4.5 | Manual Extended Thinking | thinking: {type: "enabled", budget_tokens: N} |
8.3 사용 예제
import anthropic
client = anthropic.Anthropic()
# Sonnet 4.6에서 Extended Thinking 사용
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=16000,
thinking={"type": "enabled", "budget_tokens": 10000},
messages=[
{
"role": "user",
"content": "n mod 4 == 3인 소수가 무한히 많은지 증명해줘."
}
]
)
# 응답에서 thinking과 text 블록을 구분
for block in response.content:
if block.type == "thinking":
print(f"[사고 과정 요약]\n{block.thinking}\n")
elif block.type == "text":
print(f"[최종 답변]\n{block.text}")
8.4 Adaptive Thinking (Opus 4.7)
# Opus 4.7은 adaptive thinking + effort를 사용
response = client.messages.create(
model="claude-opus-4-7",
max_tokens=16000,
thinking={"type": "adaptive"}, # budget_tokens 대신 adaptive
messages=[
{
"role": "user",
"content": "다음 시스템의 보안 취약점을 분석하고 개선 방안을 제시해줘..."
}
]
)
8.5 핵심 주의사항
•
budget_tokens은 max_tokens보다 작아야 합니다• Claude 4 모델의 thinking은 요약본으로 제공됩니다 (원본 접근은 영업팀 문의)
• thinking 토큰은 출력 토큰으로 과금됩니다 (요약본이 아닌 원본 기준)
• Opus 4.7에서
type: "enabled"를 사용하면 400 에러 발생
• 복잡한 수학/논리 문제
• 멀티스텝 코드 디버깅
• 아키텍처 설계 및 의사결정
• 법률/금융 분석
• 정확도가 극도로 중요한 작업
프롬프트 캐싱 (Prompt Caching)
9.1 프롬프트 캐싱이란?
프롬프트 캐싱은 동일한 프롬프트 접두사를 반복 사용할 때 처리 시간과 비용을 획기적으로 줄이는 기능입니다. 긴 시스템 프롬프트, 대량의 문서 컨텍스트, 도구 정의 등 매 요청마다 반복되는 부분을 캐시에 저장해 두고, 이후 요청에서는 캐시에서 읽어옵니다.
캐시 히트 시 비용은 기본 입력 토큰 가격의 10%에 불과하며, 지연 시간도 2배 이상 단축됩니다.
9.2 캐싱 방식
| 방식 | 설명 | 적합한 경우 |
|---|---|---|
| 자동 캐싱 | 최상위 cache_control 필드 추가, 시스템이 자동 관리 | 대부분의 경우 권장 |
| 수동 캐싱 | 개별 콘텐츠 블록에 cache_control 배치 | 세밀한 제어가 필요할 때 |
9.3 캐시 가격 구조
| 캐시 작업 | 배수 | 유효 시간 |
|---|---|---|
| 5분 캐시 쓰기 (Write) | 기본 입력가의 1.25x | 5분 |
| 1시간 캐시 쓰기 (Write) | 기본 입력가의 2x | 1시간 |
| 캐시 읽기 (Hit) | 기본 입력가의 0.1x | - |
즉, 5분 캐시는 단 1회 재사용만으로도 본전을 뽑고, 1시간 캐시는 2회 재사용부터 이득입니다.
9.4 구현 예제
import anthropic
client = anthropic.Anthropic()
# 긴 시스템 프롬프트 + 문서를 캐싱
long_document = "..." * 10000 # 매우 긴 문서
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=2048,
system=[
{
"type": "text",
"text": "당신은 법률 문서 분석 전문가입니다.",
},
{
"type": "text",
"text": f"다음은 분석할 계약서입니다:\n\n{long_document}",
"cache_control": {"type": "ephemeral"} # 이 부분을 캐시
}
],
messages=[
{"role": "user", "content": "이 계약서에서 위약금 조항을 찾아줘."}
]
)
# 응답의 usage에서 캐시 상태 확인
print(f"캐시 생성 토큰: {response.usage.cache_creation_input_tokens}")
print(f"캐시 읽기 토큰: {response.usage.cache_read_input_tokens}")
print(f"일반 입력 토큰: {response.usage.input_tokens}")
9.5 캐싱이 효과적인 사례
- 긴 시스템 프롬프트 : 수천 토큰의 지침이 매 요청 반복될 때
- 문서 기반 Q&A : 동일 문서에 여러 질문을 할 때
- 도구 정의 : 많은 도구를 정의한 에이전트
- 대화 이력 : 이전 대화가 길어질수록 캐싱 효과 증가
요금 체계 (Pricing)
10.1 토큰 기반 과금
Claude API는 처리한 토큰 수에 따라 과금됩니다. 토큰은 텍스트의 조각으로, 영어 기준 대략 1 토큰 ≈ 4글자 ≈ 0.75단어입니다. 한국어는 평균적으로 1글자 ≈ 1~2토큰 정도 소비됩니다. 입력 토큰과 출력 토큰이 별도로 과금되며, 출력 토큰이 더 비쌉니다.
10.2 모델별 기본 가격 (MTok = 백만 토큰)
| 모델 | 입력 ($/MTok) | 출력 ($/MTok) | 특징 |
|---|---|---|---|
| Claude Opus 4.7 | $5 | $25 | 최고 성능 |
| Claude Opus 4.6 | $5 | $25 | Fast Mode 지원 |
| Claude Opus 4.5 | $5 | $25 | |
| Claude Sonnet 4.6 | $3 | $15 | 속도+성능 균형 |
| Claude Sonnet 4.5 | $3 | $15 | |
| Claude Haiku 4.5 | $1 | $5 | 가장 경제적 |
10.3 Batch API (50% 할인)
실시간 응답이 필요 없는 대량 작업에는 Batch API를 사용하면 입출력 모두 50% 할인됩니다. 결과는 최대 24시간 내에 비동기적으로 처리됩니다.
| 모델 | Batch 입력 ($/MTok) | Batch 출력 ($/MTok) |
|---|---|---|
| Opus 4.7 / 4.6 / 4.5 | $2.50 | $12.50 |
| Sonnet 4.6 / 4.5 | $1.50 | $7.50 |
| Haiku 4.5 | $0.50 | $2.50 |
10.4 추가 비용 발생 도구
| 도구/기능 | 추가 비용 |
|---|---|
| Web Search | $10 / 1,000회 검색 + 토큰 비용 |
| Web Fetch | 추가 비용 없음 (토큰 비용만) |
| Code Execution (단독) | $0.05/시간 (월 1,550시간 무료) |
| Fast Mode (Opus 4.6) | 6배 프리미엄 ($30/$150 MTok) |
10.5 비용 절감 전략
- 프롬프트 캐싱 활용 : 반복되는 컨텍스트 비용을 90%까지 절감
- 적절한 모델 선택 : 간단한 작업에 Opus를 쓰지 말 것
- Batch API 활용 : 실시간 불필요한 대량 작업은 50% 절약
- max_tokens 적절 설정 : 불필요하게 긴 출력 방지
- Token Counting API : 전송 전 토큰 수 확인으로 예산 관리
Sonnet 4.6으로 고객 지원 챗봇을 운영한다고 가정합니다. 평균 대화가 입력 2,000토큰 + 출력 500토큰이라면:
• 1회 대화 비용 = (2,000 × $3 / 1M) + (500 × $15 / 1M) = $0.006 + $0.0075 = 약 $0.0135
• 하루 1,000건 = 약 $13.5 / 일
• 캐싱 적용 시 입력 비용 ~90% 절감 가능
Rate Limit & 최적화
11.1 Rate Limit 구조
API는 남용 방지와 자원 배분을 위해 분당 요청 수(RPM), 분당 입력 토큰 수(ITPM), 분당 출력 토큰 수(OTPM)를 제한합니다. 이 한도는 사용 티어(Tier)에 따라 자동으로 상향됩니다.
| 티어 | 진입 조건 (누적 구매) | 월 지출 한도 |
|---|---|---|
| Tier 1 | $5 | $100/월 |
| Tier 2 | $40 | $500/월 |
| Tier 3 | $200 | $1,000/월 |
| Tier 4 | $400 | $200,000/월 |
| Monthly Invoicing | 영업팀 협의 | 무제한 |
11.2 Tier 1 기본 Rate Limit
| 모델 | RPM (요청/분) | ITPM (입력 토큰/분) | OTPM (출력 토큰/분) |
|---|---|---|---|
| Opus 4.x (통합) | 50 | 30,000 | 8,000 |
| Sonnet 4.x (통합) | 50 | 30,000 | 8,000 |
| Haiku 4.5 | 50 | 50,000 | 10,000 |
11.3 429 에러 처리
Rate Limit에 도달하면 HTTP 429 에러가 반환됩니다. 응답 헤더의 retry-after 값을 확인하고, 해당 시간이 지난 후 재시도해야 합니다.
import anthropic
import time
client = anthropic.Anthropic()
def call_with_retry(messages, max_retries=5):
"""지수 백오프를 적용한 재시도 로직"""
for attempt in range(max_retries):
try:
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=messages
)
return response
except anthropic.RateLimitError as e:
if attempt == max_retries - 1:
raise
wait_time = 2 ** attempt # 1, 2, 4, 8, 16초
print(f"Rate limit 도달. {wait_time}초 후 재시도...")
time.sleep(wait_time)
return None
11.4 캐시와 Rate Limit의 관계
대부분의 모델에서 캐시 히트 토큰은 ITPM 한도에 포함되지 않습니다. 즉, 프롬프트 캐싱을 활용하면 실질적으로 처리할 수 있는 토큰 양이 크게 증가합니다.
11.5 최적화 베스트 프랙티스
- 지수 백오프(Exponential Backoff) : 429 에러 시 점진적으로 대기 시간 증가
- 프롬프트 캐싱 : 반복 컨텍스트 캐싱으로 실질 처리량 향상
- 병렬 요청 제한 : RPM을 초과하지 않도록 동시 요청 수 제어
- 급격한 트래픽 증가 방지 : 점진적으로 사용량을 늘리기 (가속 제한 회피)
- Workspace별 한도 분리 : 중요한 서비스와 실험을 분리하여 과사용 방지
실전 활용 & 치트시트
12.1 실전: 고객 지원 챗봇
import anthropic
client = anthropic.Anthropic()
SYSTEM_PROMPT = """당신은 '테크마트' 온라인 쇼핑몰의 고객 지원 AI입니다.
규칙:
1. 항상 친절하고 공손한 한국어로 답변합니다.
2. 환불/교환 문의 시 주문번호를 먼저 확인합니다.
3. 모르는 내용은 "상담원 연결"을 안내합니다.
4. 개인정보(카드번호, 비밀번호 등)는 절대 요청하지 않습니다.
상품 정보:
- 배송: 결제 후 1-3 영업일
- 교환/환불: 수령 후 7일 이내
- 고객센터: 1588-0000 (평일 9-18시)"""
def chat(conversation_history: list, user_message: str) -> str:
"""대화 이력을 유지하며 응답 생성"""
conversation_history.append(
{"role": "user", "content": user_message}
)
response = client.messages.create(
model="claude-haiku-4-5-20251001", # 빠른 응답 위해 Haiku
max_tokens=512,
system=SYSTEM_PROMPT,
messages=conversation_history
)
assistant_message = response.content[0].text
conversation_history.append(
{"role": "assistant", "content": assistant_message}
)
return assistant_message
# 사용 예시
history = []
print(chat(history, "배송은 얼마나 걸려요?"))
print(chat(history, "교환하고 싶은데 어떻게 해야 하나요?"))
12.2 실전: 구조화된 데이터 추출
import anthropic
import json
client = anthropic.Anthropic()
# Tool을 사용한 구조화된 출력 (Structured Outputs)
tools = [
{
"name": "extract_receipt",
"description": "영수증에서 정보를 추출합니다.",
"input_schema": {
"type": "object",
"properties": {
"store_name": {"type": "string", "description": "매장명"},
"date": {"type": "string", "description": "구매일 (YYYY-MM-DD)"},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {"type": "string"},
"quantity": {"type": "integer"},
"price": {"type": "number"}
},
"required": ["name", "quantity", "price"]
}
},
"total": {"type": "number", "description": "총 결제 금액"}
},
"required": ["store_name", "date", "items", "total"]
}
}
]
receipt_text = """
마트24 강남점
2024-12-15
우유 1L x2 3,400원
식빵 x1 2,800원
계란 30구 x1 6,900원
합계: 13,100원
"""
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
tools=tools,
tool_choice={"type": "tool", "name": "extract_receipt"},
messages=[
{"role": "user", "content": f"다음 영수증에서 정보를 추출해줘:\n{receipt_text}"}
]
)
# 구조화된 JSON 결과
result = response.content[0].input
print(json.dumps(result, ensure_ascii=False, indent=2))
12.3 API 호출 치트시트
# =============================================
# Claude API 치트시트 - 핵심 패턴 모음
# =============================================
import anthropic
client = anthropic.Anthropic()
# ── 1. 기본 호출 ──
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello!"}]
)
# ── 2. 시스템 프롬프트 ──
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system="당신은 한국어 번역가입니다.",
messages=[{"role": "user", "content": "Translate: Hello World"}]
)
# ── 3. 스트리밍 ──
with client.messages.stream(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "긴 이야기를 해줘."}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
# ── 4. 이미지 입력 (URL) ──
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{"type": "image", "source": {"type": "url", "url": "https://..."}},
{"type": "text", "text": "이 이미지를 설명해줘."}
]
}]
)
# ── 5. Tool Use ──
tools = [{"name": "calc", "description": "계산기",
"input_schema": {"type": "object",
"properties": {"expression": {"type": "string"}},
"required": ["expression"]}}]
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
tools=tools,
messages=[{"role": "user", "content": "2^10 계산해줘"}]
)
# ── 6. Extended Thinking ──
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=16000,
thinking={"type": "enabled", "budget_tokens": 10000},
messages=[{"role": "user", "content": "복잡한 문제..."}]
)
# ── 7. 프롬프트 캐싱 ──
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system=[{
"type": "text",
"text": "매우 긴 시스템 프롬프트...",
"cache_control": {"type": "ephemeral"}
}],
messages=[{"role": "user", "content": "질문"}]
)
# ── 8. Batch API ──
batch = client.messages.batches.create(
requests=[
{"custom_id": "req-1",
"params": {"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "질문1"}]}},
{"custom_id": "req-2",
"params": {"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "질문2"}]}}
]
)
# ── 9. 토큰 카운팅 ──
count = client.messages.count_tokens(
model="claude-sonnet-4-6",
messages=[{"role": "user", "content": "Hello!"}]
)
print(f"입력 토큰: {count.input_tokens}")
# ── 10. Web Search (서버 도구) ──
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=2048,
tools=[{"type": "web_search_20260209"}],
messages=[{"role": "user", "content": "최신 뉴스 검색해줘"}]
)
12.4 자주 하는 실수 & 해결법
| 실수 | 증상 | 해결법 |
|---|---|---|
| API 키를 프론트엔드에 노출 | 키 유출, 과금 폭탄 | 항상 서버 사이드에서 호출 |
| max_tokens 미설정 | 에러 발생 (필수 파라미터) | 항상 명시적으로 설정 |
| messages 순서 오류 | 400 에러 | user/assistant 반드시 교대 배치 |
| 대화 이력 누락 | 맥락 없는 응답 | 이전 대화 전체를 매번 포함 |
| stream + tool_use 혼합 오류 | 파싱 실패 | 이벤트 타입별 분기 처리 구현 |
| Opus 4.7에서 budget_tokens 사용 | 400 에러 | adaptive thinking 사용 |
| 캐시 최소 토큰 미달 | 캐시 미생성 | 최소 1,024 토큰 이상 캐싱 |
| Rate Limit 무시 | 429 에러 반복 | 지수 백오프 + retry-after 준수 |
12.5 유용한 리소스
| 리소스 | URL | 설명 |
|---|---|---|
| 공식 문서 | platform.claude.com/docs | 가장 정확한 최신 정보 |
| API Reference | platform.claude.com/docs/en/api/overview | 엔드포인트 상세 스펙 |
| Anthropic Cookbook | github.com/anthropics/anthropic-cookbook | 예제 코드 모음 |
| Console (Workbench) | console.anthropic.com | 브라우저에서 API 테스트 |
| Prompt Engineering Guide | platform.claude.com/docs/en/build-with-claude/prompt-engineering | 프롬프트 작성법 |
| Discord | anthropic.com/discord | 커뮤니티 지원 |
12.6 마치며
Claude API는 단순한 텍스트 생성 API를 넘어, Vision, Tool Use, Extended Thinking, 프롬프트 캐싱, Batch 처리 등 다양한 기능을 제공하는 종합 AI 플랫폼입니다. 이 튜토리얼에서 다룬 내용을 바탕으로 실제 프로젝트에 Claude를 통합해 보세요.
1. 적절한 모델을 선택하세요 — 모든 작업에 Opus를 쓸 필요 없습니다. 간단한 작업은 Haiku, 일반 작업은 Sonnet, 복잡한 추론만 Opus를 사용하면 비용을 10배 이상 절약할 수 있습니다.
2. 시스템 프롬프트를 정성껏 설계하세요 — 좋은 시스템 프롬프트 하나가 응답 품질을 극적으로 바꿉니다. 역할, 규칙, 출력 형식, 예시를 명확히 포함하세요.
3. 캐싱과 배치를 적극 활용하세요 — 반복 컨텍스트에는 캐싱을, 비실시간 대량 작업에는 Batch API를 사용하면 비용과 속도 모두 최적화할 수 있습니다.